package com.yishan.thread;


/**
 * 使用  ThreadLocal  线程隔离 以空间换时间 每个线程之间的数据相互隔离
 * 为每个线程提供一份变量副本，实现同时访问而互不干扰
 *
 * 好处：
 *  1. 传递数据：保存每个线程绑定的数据，在需要的地方可以直接获取，避免参数直接传递带来的代码耦合问题
 *  2. 线程隔离：各线程之间的数据相互隔离却又具备并发性，避免同步方式带来的性能损失
 **/
public class ThreadLocalTest2 {

    ThreadLocal<String> t1 = new ThreadLocal<String>();

    private String data;

    public String getData() {
        return t1.get();
    }

    public void setData(String data) {
        t1.set(data);
    }

    public static void main(String[] args) {
        final ThreadLocalTest2 demo = new ThreadLocalTest2();

        for (int i = 0; i < 5; i++) {

            Thread thread = new Thread(new Runnable() {
                public void run() {
                    demo.setData(Thread.currentThread().getName() + "的数据");
                    System.out.println("---------------------------------");
                    System.out.println(Thread.currentThread().getName() + "------->" + demo.getData());
                }
            });
            thread.setName("线程" + i);
            thread.start();

        }
        //运行结果
        //---------------------------------
        //---------------------------------
        //线程2------->线程2的数据
        //---------------------------------
        //线程3------->线程3的数据
        //线程0------->线程0的数据
        //---------------------------------
        //线程4------->线程4的数据
        //线程1------->线程1的数据

    }

}
